/*
 *         Copyright (c) KUBOTA Corporation and HUDSON SOFT,
 *                  1994, 1995 All Rights Reserved
 *
 *  This software comprises unpublished confidential information of
 *  KUBOTA Corp. and HUDSON SOFT. It may not be used, copied or made 
 *  available to anyone, except in accordance with the license under
 *  which it is furnished.
 */
static char SccsId[] = "@(#)adput.c	1.6 9/19/95";
#include <farl.h>
#include <agl.h>

/*
 * ライトベクタが転送されていなかった場合は転送し、
 * オーロラへオブジェクトデータを転送する。
 */

void
AGLPutObj(object *obj)
{
     register unsigned long	cnt;
     fix1015	lnrm[3];

     /* ライト１のベクタをまだ転送していない場合 */
     if (__AGLLight[AGL_LIGHT0].lightChanged == 1
	 || (__AGLLight[AGL_LIGHT0].lightChanged != -1 &&
	     __AGLCamera.camChanged != 0)) {

	  if (__AGLCamera.camChanged >= 0) {
	       /* カメラが変わっていた場合は、再計算ののち転送 */
	       fix1015		m[3];

	       FarlSetSrcMatrix3x1((unsigned short*)__AGLLight[AGL_LIGHT0].lightVector);
	       FarlMul3x3M1015((unsigned short*)__AGLCamera.camMatrix1015);
	       FarlCopyDstToMem3x1((unsigned short*)m);
	       FarlNormalizeVector(m);
	       FarlSetLight1(m[0], m[1], m[2]);
	  } else if (__AGLCamera.camChanged < 0) {
	       /*
		* カメラがリセットだけされた場合は
		* カメラマトリクスと掛けないで転送
		*/
	       FarlNormalizeVector(__AGLLight[AGL_LIGHT0].lightVector);
	       FarlSetLight1(__AGLLight[AGL_LIGHT0].lightVector[0],
			     __AGLLight[AGL_LIGHT0].lightVector[1],
			     __AGLLight[AGL_LIGHT0].lightVector[2]);
	  }
	  __AGLLight[AGL_LIGHT0].lightChanged = -1;
     }

     /* ライト２のベクタをまだ転送してない場合 */
     if (__AGLLight[AGL_LIGHT1].lightChanged == 1
	 || (__AGLLight[AGL_LIGHT1].lightChanged != -1 &&
	     __AGLCamera.camChanged != 0)) {

	  if (__AGLCamera.camChanged >= 0) {
	       /* カメラが変わっていた場合は、再計算ののち転送 */
	       fix1015		m[3];

	       FarlSetSrcMatrix3x1((unsigned short*)__AGLLight[AGL_LIGHT1].lightVector);
	       FarlMul3x3M1015((unsigned short*)__AGLCamera.camMatrix1015);
	       FarlCopyDstToMem3x1((fix1015*)m);
	       FarlNormalizeVector(m);
	       FarlSetLight2(m[0], m[1], m[2]);
	  } else if (__AGLCamera.camChanged < 0) {
	       /*
		* カメラがリセットだけされた場合は
		* カメラマトリクスと掛けないで転送
		*/
	       FarlNormalizeVector(__AGLLight[AGL_LIGHT1].lightVector);
	       FarlSetLight2(__AGLLight[AGL_LIGHT1].lightVector[0],
			     __AGLLight[AGL_LIGHT1].lightVector[1],
			     __AGLLight[AGL_LIGHT1].lightVector[2]);
	  }
	  __AGLLight[AGL_LIGHT1].lightChanged = -1;
     }

     if (obj->material != NULL) {
	  FarlSetLightCoef(obj->material->rmat[0],
	  		   obj->material->rmat[1],
	  		   obj->material->rmat[2],
	  		   obj->material->rmat[3],
	  		   obj->material->rmat[4]);
     }

     /*
      * objToWorld187マトリクスとobjMatrixを掛けてオーロラへセット
      */
     if (__AGLCamera.camChanged >= -1) {
	  FarlSetSrcMatrix((unsigned short*)obj->objToWorld187);
	  FarlMul4x4M187((unsigned short*)obj->objMatrix);
	  FarlCopyDstToObj();
     } else {
	  FarlSetTEObjMatrix((unsigned short*)(obj->objToWorld187));
     }

     /*
      * objToWorld1015マトリクスとnrmMatrixを掛けてオーロラへセット
      */
     if (__AGLCamera.camChanged >= 0) {
	  FarlSetSrcMatrix3x3((unsigned short*)obj->objToWorld1015);
	  FarlMul3x3M1015((unsigned short*)obj->nrmMatrix);
	  FarlCopyDstToNrm();
     } else {
	  FarlSetTENrmMatrix((unsigned short*)obj->objToWorld1015);
     }

     obj->objChanged = 0;

     /* コマンドパケットをオーロラのポートに出力する */
     FarlWriteFifoWA(obj->geometryTop, obj->geometryLength);
}
